/*************************************************************************
    > File Name    : TaskQueue.h
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月24日 星期四 20时52分26秒
 ************************************************************************/

#ifndef __LL_TASKQUEUE_H__
#define __LL_TASKQUEUE_H__

#include "NonCopyable.h"
#include "MutexLock.h"
#include "Condition.h"
#include <queue>
#include <functional>
using std::queue;
using std::function;

using ElemType = function<void()>;

class TaskQueue
: public NonCopyable
{
public:
    TaskQueue(size_t queueSize);
    ~TaskQueue();
    
    bool empty();
    bool full();

    void push(const ElemType &value);
    void push(ElemType &&value);
    ElemType pop();

    void weakup();                      //线程池退出，唤醒所有子线程

private:
    size_t              _queueSize;
    queue<ElemType>     _queue;
    MutexLock           _mutex;
    Condition           _notFull;
    Condition           _notEmpty;
    bool                _isExistTP;      //标志位，标志线程池的退出
};

#endif
